package cn.com.frame.util;

import org.apache.commons.lang3.RandomStringUtils;

import java.util.Calendar;

public class KeyUtils {
    //  长度:60; 去掉大写字母 O 和 数字 0
    private final static String[] STR = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N","P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};

    /**
     * 长度 7 到9位之间 【生成方式： 时间戳】
     * 尽量用这个方法 性能好 缺点：每一毫秒为一个key 并发会重复
     * @return
     */
    public static String getTimeKey() {
        StringBuilder b = new StringBuilder(18);
        Calendar Cld = Calendar.getInstance();
        int yy = Cld.get(Calendar.YEAR) - 2000;
        int mm = Cld.get(Calendar.MONTH) + 1;
        int dd = Cld.get(Calendar.DATE);
        int h = Cld.get(Calendar.HOUR_OF_DAY);
        int m = Cld.get(Calendar.MINUTE);
        int s = Cld.get(Calendar.SECOND);
        int i = Cld.get(Calendar.MILLISECOND);
        b.append(STR[yy]).append(STR[mm]).append(STR[dd]).append(STR[h]).append(STR[m]).append(STR[s]).append(i);
        return b.toString();
    }

    /** startSign + 长度 7 到9位  + endNum
     *
     * @param startSign  前缀名
     * @param endNum  后缀（随机生成几位）
     * @return
     */
    public static String getKeyStartSign(String startSign,int endNum){
        StringBuilder b = new StringBuilder(40);
        b.append(startSign).append(getTimeKey());
        if(endNum<=0){
            return b.toString();
        }
        if(endNum>5){
            endNum = 5;//最多5位，保证性能
        }
        b.append(RandomStringUtils.randomAlphanumeric(endNum));
        return b.toString();
    }

    /**
     * 生成唯一KEY 12  到 15位 +startSign
     * @return
     */
    public static String getKeyStartSign(String startSign){
        return getKeyStartSign(startSign,3);
    }

    /**
     * 生成唯一KEY 12  到 15位
     * @return
     */
    public static String getKey(){
        StringBuilder b = new StringBuilder(30);
        b.append(getTimeKey());
        b.append(RandomStringUtils.randomAlphanumeric(5));
        return b.toString();
    }
}
